package com.rzjm.api.dao;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
import java.util.Map;


@SuppressWarnings("unchecked")
public interface BaseDao<T> extends BaseMapper<T> {

    /**
     * 根据map参数查询数量
     *
     * @param params
     * @return
     */
    default long selectCountByMap(Map<String, Object> params) {
        QueryWrapper<T> qw = new QueryWrapper<>();
        params.entrySet().forEach((entry) -> {
            qw.eq(entry.getKey(), entry.getValue());
        });
        return selectCount(qw);
    }

    /**
     * 根据QueryWrapper参数查询数量
     * @param qw
     * @return
     */
    public default long selectCountByQueryWrapper(QueryWrapper<T> qw) {
        return this.selectCount(qw);
    }

    /**
     * 根据一列值查询数量
     * @param column
     * @param value
     * @return
     */
    default long selectCountByColumn(String column, Object value) {
        QueryWrapper<T> qw = new QueryWrapper<T>();
        qw.eq(column, value);
        return selectCount(qw);
    }

    /**
     * 通过一列值查询
     *
     * @param column
     * @param value
     * @return
     */
    default List<T> selectListByColumn(String column, Object value) {
        QueryWrapper<T> qw = new QueryWrapper<T>();
        qw.eq(column, value);
        return selectList(qw);
    }

    /**
     * 通过一列值查询
     *
     * @param column
     * @param value
     * @return
     */
    default T selectOneByColumn(String column, Object value) {
        QueryWrapper<T> qw = new QueryWrapper<T>();
        qw.eq(column, value);
        return selectOne(qw);
    }

    default List<T> getPageEntityList(QueryWrapper queryWrapper, int pageNum, int pageSize) {
        Page<T> page = new Page<>(pageNum,pageSize);
        IPage<T> list = selectPage(page,queryWrapper);
        return list.getRecords();
    }


    default List<T> selectAllList(){
        return this.selectList(null);
    }
}
